package belf.migrate.api.table.schema;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 描述关系数据库表中一列的元数据信息.<br/>
 * @see {@link <a href="https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html">JDBC ResultSetMetaData</a>
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ColumnMetaData implements Serializable {
    private static final long serialVersionUID = -1L;
    /** 字段所属的catalog名称，一般指数据库名称 */
    private String catalogName;
    /** schema名称 */
    private String schemaName;
    /** 表名 */
    private String tableName;
    /** 字段名称 */
    private String columnName;
    /** 字段建议标题名称，一般用于打印显示 */
    private String columnLabel;
    /**
     * 如果调用 ResultSet.getObject 方法从列中检索值，则返回创建其实例的 Java 类的完全限定名称。
     * 对应与{@link java.sql.Types}里定义的
     */
    private String columnClassName;
    /** 字段的JDBC type, 参考{@link java.sql.Types} */
    private int columnType;
    /** 返回数据库的特定类型名称 */
    private String columnTypeName;
    /**
     * 表示用于存储数据的字符数。 它通常用于定义字符类型和二进制类型的长度。
     * 例如，如果length为10，则表示该字段可以存储最多10个字符，例如 "Hello, world"或"1234567890"。
     */
    private long columnDisplaySize;
    /**
     * Precision 表示数字的总位数，包括整数部分和小数部分。 它通常用于定义数值类型的范围和精度。
     * 例如，如果 precision 为 5，则表示该字段可以存储最多 5 位数字，例如 12345 或 -9876.0。
     */
    private int precision;
    /**
     * 表示小数点后可以存储的数字位数。 它通常用于定义浮点数和定点数值类型的精度。
     * 例如，如果 scale 为 2，则表示该字段可以存储两位小数，例如 12.34 或 -56.78。
     */
    private int scale;
    /** 是否自增字段。注意达梦数据库的自增有IDENTITY和Auto Increment两种 */
    private boolean autoIncrement;
    /** 字段内容是否大小写敏感。true表示大小写敏感，false表示大小写无关  */
    private boolean caseSensitive;
    /** 0表示不允许为空；1表示可以为空 */
    private int nullable;
    /** 栏目评论信息 */
    private String columnComment;

    /** 栏目默认值等额外信息 */
    private ColumnExtra extra;

    private boolean isPrimaryKey;

}
